﻿using System;
// 委托将方法调用者和目标方法动态关联起来。
namespace _080_委托
{
    class Program
    {
        // 代理类型定义了代理实例可调用的方法。具体地，它定义了方法的返回类型及其参数类型。
        //下面的语句定义了一个代理类型Transformer：
        delegate int Transformer(int x);
        //Transformer兼容任何返回类型为int且有一个int类型参数的方法，如
        static int Square(int x) { return x * x; }
        static void Main(string[] args)
        {
            //将一个方法赋值给一个代理变量，可以创建一个代理实例：
            Transformer t = Square; // 创建委托实例
            //它可以像调用方法一样调用：
            int answer = t(3); // answer is 9 //调用委托
            Console.WriteLine(answer);
            // 委托实例实际上是调用者的代表：调用者先调用委托，然后委托调用目标方法。这种间接调用方式可以将调用者和目标方法分开。
            // 调用委托和调用方法类似（因为委托的目的仅仅是提供一定程序的间接性）：
            //t(3);
            //语句
            //Transformer t = Square;
            //是下面的语句的简写：
            //Transformer t = new Transformer(Square);
            //语句：
            //t(3);
            //是下面语句的简写：
            //t.Invoke(3);
            Console.ReadKey();
        }
    }
}
